import assert from 'assert';

const ERR_NOT_IMPLEMENTED = 'NOT implemented';

/**
 * 数据库操作基类（确定核心操作接口并提供部分通用方法）
 */
/* eslint no-unused-vars: 0 */
export default class DB {
    /**
     * @param config 连接配置参数：
     * type - 数据库类型（默认mysql）
     * host - 数据库服务器地址
     * port - 数据库服务端口
     * username - 用户名
     * password - 密码
     * database - 默认数据库
     * pool_size - 连接池数量
     * 其它 - 数据库类型相关
     */
    constructor(config) {
        assert(config !== null);
    }

    /// 测试用
    get _() {
        return this.sql;
    }

    /////////////////////////////////////////////////////////////////
    // 连接

    /// 打开连接（必须在Promise里返回this）
    open() {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /// 关闭连接
    close() {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /// 启动事务（必须在Promise里返回this）
    begin() {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /// 提交事务
    commit() {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /// 回滚事务
    abort() {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /////////////////////////////////////////////////////////////////
    // 库

    /// 获取数据库名称列表
    dbs() {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /**
     * 获取表名称列表
     * @param db 数据库名称（如为空则使用默认数据库）
     */
    tables(db) {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /**
     * 创建数据库
     * @param opt 如为string则代表库名，否则形如：{
     * db - 数据库名称
     * exists - 是否检查存在性
     * }
     */
    createDb(opt) {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /**
     * 删除数据库
     * @param db 数据库名称
     * @param opt 是否检查存在性
     */
    removeDb(db, ...opt) {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /////////////////////////////////////////////////////////////////
    // 表

    /**
     * 创建表
     * @param opt 参数：{
     * db - 库名
     * table - 表名
     * fields - 字段定义列表
     * exists - 是否检查存在性
     * }
     */
    createTable(opt) {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /**
     * 修改表结构
     * @param opt 参数：{
     * db - 库名
     * table - 表名
     * fields - 字段定义列表
     * }
     */
    updateTable(opt) {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /**
     * 删除表
     * @param opt 参数：{
     * db - 库名
     * table - 表名
     * exists - 是否检查存在性
     * }
     */
    removeTable(opt) {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /**
     * 获取字段列表
     * @param opt 参数：{
     * db - 库名
     * table - 表名
     * }
     * @return 字段列表： [{
     * name - 名称
     * type - 类型
     * length - 长度
     * values - 取值范围
     * default - 默认值
     * nullable - 是否可空
     * }]
     */
    fields(opt) {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /////////////////////////////////////////////////////////////////
    // 查询

    /**
     * 查询
     * @param opt 参数：{
     * db - 库名
     * table - 表名
     * fields - 字段列表
     * where - 条件
     * order - 排序
     * start - 起始记录索引
     * count - 返回的记录数量
     * page - 指定记录页号（此时count同时作为每页记录数）
     * sqlOnly - 只返回SQL语句，不实际执行，调试用,
     * withFields - 查询结果带字段信息，形如：{rows: [], fields: []}
     * }
	 * @param params 当opt是SQL字符串时，用于传入参数（数组）
     */
    query(opt, params) {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }

    /**
     * 计数
     * @param opt 同query方法
	 * @param params 当opt是SQL字符串时，用于传入参数（数组）
     */
    count(opt, params) {
        throw new Error(ERR_NOT_IMPLEMENTED);
    }
}
